package com.firefly.admin.system.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.firefly.admin.common.vo.Result;
import com.firefly.admin.system.entity.FySystemNotice;
import com.firefly.admin.system.entity.FySystemUser;
import com.firefly.admin.system.entity.FySystemUserNotice;
import com.firefly.admin.system.vo.SelectOption;
import com.firefly.admin.system.vo.SystemNoticeQueryVo;
import com.firefly.admin.system.vo.SystemNoticeStatusUpdateVo;

import java.util.List;
import java.util.Map;

public interface FySystemNoticeService {
    /**
     * 分页查询系统通知接口
     *
     * @param systemNoticeQueryVo 系统通知查询条件
     * @return 系统通知信息列表
     */
    Result<Page<FySystemNotice>> getSystemNoticeList(SystemNoticeQueryVo systemNoticeQueryVo);

    /**
     * 查询已发布最新的系统公告接口
     *
     * @return 系统通知信息列表
     */
    Result<FySystemNotice> getLastSystemNotice();

    /**
     * 获取系统通知信息接口
     *
     * @param noticeId 系统通知ID
     * @return 系统通知信息
     */
    Result<FySystemNotice> getSystemNotice(Long noticeId);

    /**
     * 系统通知信息新增接口
     *
     * @param fySystemNotice 系统通知信息
     * @return 新增结果
     */
    Result<FySystemNotice> add(FySystemNotice fySystemNotice);

    /**
     * 系统通知信息编辑接口
     *
     * @param fySystemNotice 系统通知信息
     * @return 编辑结果
     */
    Result<FySystemNotice> update(FySystemNotice fySystemNotice);

    /**
     * 系统通知状态修改接口
     *
     * @param systemNoticeStatusUpdateVo 系统通知状态编辑参数
     * @return 操作结果
     */
    Result<FySystemNotice> updateStatus(SystemNoticeStatusUpdateVo systemNoticeStatusUpdateVo);

    /**
     * 系统通知信息删除接口
     *
     * @param noticeId 通知ID
     * @return 删除结果
     */
    Result<String> delete(Long noticeId);

    /**
     * 查询已发布最新5条公告接口
     *
     * @return 系统通知信息列表
     */
    Result<Map<String, List<FySystemNotice>>> getNoticeTop5List();

    /**
     * 查询公告条数接口
     *
     * @return 条数
     */
    Result<Integer> getUnReadNoticeCount();

    /**
     * 系统用户通知已读接口
     *
     * @param noticeId 消息ID
     * @return 操作结果
     */
    Result<FySystemUserNotice> alreadyRead(Long noticeId);

    /**
     * 查询用户通知公告列表接口
     *
     * @param noticeType 通知公告类型
     * @return 系统通知信息列表
     */
    Result<List<FySystemNotice>> getNoticeList(String noticeType);

    /**
     * 查询公告可通知对象列表
     *
     * @param noticeObjectType 公告通知对象类型
     * @return 可通知对象列表
     */
    Result<List<SelectOption>> getNoticeObjectSelectList(String noticeObjectType);

    /**
     * 根据公告ID查询公告通知对象列表
     *
     * @param noticeId 公告ID
     * @return 可通知对象列表
     */
    Result<List<FySystemUser>> getNoticeObjectList(Long noticeId);
}
